import axios, { AxiosResponse } from 'axios'

// 定义缓存项的接口
interface CacheItem<T> {
  response: T
  expiry: number
}

// 创建一个Map用于存储缓存数据，使用泛型来指定缓存数据的类型
const cache = new Map<string, CacheItem<any>>()

// 缓存时间，单位为毫秒
const cacheDuration = 1000

// 定义一个泛型函数来处理缓存逻辑
export async function postCache(url: string, pms: any): Promise<AxiosResponse> {
  // 检查缓存中是否有对应URL的数据，并且未过期
  const cachedData = cache.get(url)
  if (cachedData && Date.now() < cachedData.expiry) {
    // 使用缓存数据构造一个模拟的响应对象
    return Promise.resolve({ data: cachedData.response } as AxiosResponse)
  }

  try {
    console.log('url:' + url)

    // 发起网络请求
    const res = await axios.post(url, pms)

    // 将响应数据和过期时间存入缓存
    cache.set(url, {
      response: res.data,
      expiry: Date.now() + cacheDuration
    })

    return res
  } catch (error) {
    throw error
  }
}

// // 替换原来的axios调用
// fetchWithCache<YourDataType>(url)
//   .then((res) => {
//     let ret = res.data;
//     _items.value = ret.data; // 注意：这里假设ret具有data属性

//     // 获取数据后进行下拉选项初始化
//     initItems();
//   })
//   .catch((e) => {
//     console.error(e);
//     alert('下拉框数据加载异常');
//   });

const requestCache = new Map()
/**
 * 1秒内多次重复请求, 合并请求(复用第一次的请求结果)
 * PS 因为复用 promise, 所以 then 逻辑也会都是和第一次的保持一致.
 * @param url
 * @param params
 * @returns
 */
export async function postMerge(url: string, params: any) {
  const cacheKey = JSON.stringify({ url, params })
  if (requestCache.has(cacheKey)) {
    console.log('post url cache:' + url)
    return requestCache.get(cacheKey)
  }
  const promise = axios.post(url, params)
  requestCache.set(cacheKey, promise)
  try {
    return await promise
  } catch (error) {
    requestCache.delete(cacheKey) // 请求失败时清除缓存
    throw error
  }
}

/**
 * 模拟线程睡眠
 * @param ms
 * @returns
 */
export function wait(ms: number): Promise<void> {
  return new Promise((resolve) => setTimeout(resolve, ms))
}

// 使用 async/await 语法
// async function example() {
//   console.log('开始等待...')
//   await wait(200) // 等待200ms
//   console.log('等待结束')
// }
